﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*-------------------------------------------------
 *  
 * LiMeLanguage MainCode.
 * Latest Update 2011-5-1.
 * 
 * ...関数別に分ける処理はほぼ完了。
 * ...if()[]も関数として認識されてしまうので、修正中。
 * ...上記は修正完了。
 * 
 * Edit By Swallow.
 * 
---------------------------------------------------*/

namespace Split
{




    static class Function
    {


        public static void Split(ref List<Functions> CodeFunctions, List<Expression> CodeTokens)
        {
            //////////////////////////
            //コードの関数分割
            int FuncCounter = 0;
            CodeFunctions.Add(new Functions());


            int TokenCount = 0;//TokenListのIndex
            bool NameSign = false;//名前か
            bool FunctionSign = false;

            int nest = 0;

            foreach (Expression e in CodeTokens) //CodeTokensのループ
            {


                string[] TokenList = e.TokenList.ToArray();//トークンのリスト
                foreach (string Token in TokenList)//文ループ
                {
                    #region debug
#if DEBUG
                    Console.WriteLine("[Debug::Split::Function::TokenCount]{0}", TokenCount);
                    Console.WriteLine("[Debug::Split::Function::Nest]{0}", nest);
                    Console.WriteLine("[Debug::Split::Function::Token]{0}", Token);
#endif
                    #endregion

                    if (Token == "@")//名前宣言トークンなら
                    {
                        if (NameSign == true)
                        {
                            NameSign = false;//ここから先は名前ではない
                            continue;//Tokenではないので飛ばす
                        }
                        else if (NameSign == false)
                        {
                            NameSign = true;//引数である
                            continue;//Tokenではないので飛ばす
                        }
                    }


                        /////////
                        //開始点のTokenだったら
                    else if (Token == "[")
                    {

                        if (FunctionSign == false)//まだ関数の域ではないなら
                        {
                            FunctionSign = true;//ここから関数の域
                            continue;
                        }

                        else //関数の域なら
                        {

                            CodeFunctions[FuncCounter].Expression.Add(Token);
                            nest++;

                            #region debug
#if DEBUG
                            Console.WriteLine("[Debug::Split::Function::NestChanged]{0}", nest);
#endif
                            #endregion
                        }


                    }

                    ////////////////
                    //終端のTokenだったら
                    else if (Token == "]")
                    {
                        if (FunctionSign == true)//関数の域ならば
                        {
                            #region debug
#if DEBUG
                            Console.Write("[Debug::Split::Function::Token::End]");
#endif
                            #endregion
                            if (nest == 0)　//ネストがないなら
                            {
                                #region debug
#if DEBUG
                                Console.WriteLine("End.");
#endif
                                #endregion
                                FuncCounter++;//関数Listに追加
                                CodeFunctions.Add(new Functions());//追加分適用
                                FunctionSign = false;//ここから関数の域でない
                                TokenCount = 0;//リセット
                                continue;
                            }
                            else if (nest >= 1)//ネスト中なら
                            {
                                CodeFunctions[FuncCounter].Expression.Add(Token);
                                nest--;//一段下げる

                                #region debug
#if DEBUG
                                Console.WriteLine("Nest .. {0}", nest);
#endif
                                #endregion
                            }

                        }

                    }


                        /////////////////////
                        //それ以外のToken
                    else
                    {
                        if (NameSign == true)
                        {
                            CodeFunctions[FuncCounter].Name += Token;//名前に追加
                            continue;//名前はTokenではないので飛ばす
                        }
                        else if (FunctionSign == true)//中身なら
                        {
                            CodeFunctions[FuncCounter].Expression.Add(Token);//追加
                        }
                    }
                    TokenCount++;
                }

            }

            //////////////////
            //最後の関数は空の可能性が高いので、もしそうであれば削除
            if (CodeFunctions[CodeFunctions.Count - 1].Name == "")
            {
                CodeFunctions.RemoveAt(CodeFunctions.Count - 1);
            }
        }



    }




}